package business;

import java.util.ArrayList;
import java.util.Iterator;

import persistence.db.DataSet;
import persistence.model.AbstractModel;
import persistence.model.Service;
import persistence.model.TypeHeure;
import utility.Record;

public class TypeHeureBL {
	
	private TypeHeure th = null;
	ArrayList<String> listeErreurs = null;
	
	public TypeHeureBL() {

	}

	public TypeHeureBL(int id) {
		th = (TypeHeure) TypeHeure.all().get(id);
	}

	
	/**
	 * @return retourne si la demande d'ajout ou de modification est valide ou non
	 */
	public boolean estValidePourModif(){
		boolean estValide = true;
		boolean existeDeja = false;
		for (AbstractModel typeHeure : TypeHeure.all())
		{
			TypeHeure thCourant = (TypeHeure)typeHeure;
			if (thCourant.getNomTypeHeure().equals( th.getNomTypeHeure())) {
				estValide = false;
				existeDeja = true;
			}
		}
		if (existeDeja) {
			listeErreurs.add("Ce type d'heure existe déjà.");
		}
		if (th.getNomTypeHeure().length() > 20) {
			listeErreurs.add("Le nom est trop long.");
			estValide = false;
		}
		return estValide;
	}
	
	/**
	 * @return retourne si la demande de suppression est valide ou non
	 */
	public boolean estValidePourSuppr(){
		boolean estValide = true;
		/* Ensemble des service du type d'enseignement en cours*/
		DataSet serviceset = Service.all().filter("fk_service_type_heure = " + th.getId());
		Iterator<AbstractModel> it = serviceset.iterator();
		if (it.hasNext()) {
			/* il existe un see concernant ce type d'enseignement */
			listeErreurs.add("Il y a au moins un service qui correspond à ce type d'heure.");
			estValide = false;
		}
		return estValide;
	}
	
	/**
	 * @param id : identifiant du type d'heure
	 * @param nom : nom du type d'heure
	 * @return liste des erreurs rencontrées
	 */
	public ArrayList<String> ajouterTypeHeure(int id, String nom) {
		listeErreurs = new ArrayList<String>();
		th = new TypeHeure(id, nom);
		boolean estValide = this.estValidePourModif();
		System.out.println("valide : " + estValide);
		if (estValide) {
			th.save();
		}
		return listeErreurs;
	}
	
	/**
	 * @param id : identifiant du type d'heure
	 * @param nom : nom du type d'heure
	 * @return liste des erreurs rencontrées
	 */
	public ArrayList<String> modifierTypeHeure(int id, String nom) {
		listeErreurs = new ArrayList<String>();
		th = new TypeHeure(id, nom);
		if (this.estValidePourModif()) {
			th.save(id);
		}
		return listeErreurs;
	}
	
	/**
	 * @param id : identifiant du type d'heure
	 * @return liste des erreurs rencontrées
	 */
	public ArrayList<String> supprimerTypeHeure() {
		listeErreurs = new ArrayList<String>();
		if (this.estValidePourSuppr()) {
			th.delete();
		}
		return listeErreurs;
	}
	
	/* Ensemble des getters et setters -> delegation vers la persistance */
		
	public int getIdTypeHeure() {
		return th.getId();
	}

	public void setIdTypeHeure(int idTypeHeure) {
		th.setId(idTypeHeure);
	}

	public String getNomTypeHeure() {
		return th.getNomTypeHeure();
	}

	public void setNomTypeHeure(String nomTypeHeure) {
		th.setNomTypeHeure(nomTypeHeure);
	}
	
	/**
	 * @return une liste de record
	 * chaque record comprenant le nom du type heure ainsi que son id
	 */
	public ArrayList<Record> getListeTypeHeure()
	{
		ArrayList<Record> listeTypeHeure = new ArrayList<Record>();
		for (AbstractModel th : TypeHeure.all())
		{
			TypeHeure typeCourant = (TypeHeure)th;
			
			int idTypeHeure = typeCourant.getId();
			String nomTypeHeure = typeCourant.getNomTypeHeure();
			
			listeTypeHeure.add(new Record(idTypeHeure, nomTypeHeure));
		}
		
		return listeTypeHeure;
	}

}
